package driver

import (
	"sync"
	"sync/atomic"

	"gitee.com/gousing/cache/storage"
)

// memoryEntry Memory 缓存项的结构, 包含双向链表节点指向
type memoryEntry struct {
	key        string       // 缓存键名
	kind       storage.Kind // 缓存类型
	value      any          // 缓存值, 标量类型直接存储，其他类型序列化后存储
	size       int          // 缓存大小，单位为字节
	expiredMs  int64        // 过期时间戳(毫秒)
	prev, next *memoryEntry // 双向链表节点，用于快速访问缓存项的前一个和后一个
	isEvicted  atomic.Bool  // 是否正在被淘汰，用于并发淘汰时防止重复淘汰
}

var memoryEntrysPool = sync.Pool{
	New: func() any {
		return &memoryEntry{}
	},
}

// GetMemoryEntryFromPool 从 memoryEntrys 池获取一个新的 memoryEntry 对象, 并重置其值
func GetMemoryEntryFromPool() *memoryEntry {
	e := memoryEntrysPool.Get().(*memoryEntry)
	e.Reset()
	return e
}

// Reset 重置缓存数据
func (e *memoryEntry) Reset() {
	e.key = ""
	e.value = nil
	e.kind = 0
	e.size = 0
	e.expiredMs = 0
	e.isEvicted.Store(true) //避免被异步进程淘汰
}

// Release 重置并回收 memoryEntry 对象到 memoryEntrys 池, 并重置其值, 以便下次使用
func (e *memoryEntry) Release() {
	if e != nil {
		e.Reset()
		memoryEntrysPool.Put(e)
	}
}
